﻿using System;
using System.Collections.Generic;
using System.Text;

namespace daSyntaxAnalyser.SyntaxTree
{
    using daBase.Objects;

    /// <summary>
    /// Заголовок функции dispatch-интерфейса
    /// </summary>
    public class DispinterfaceFunctionHeadElement : InnerFunctionHeadElement
    {
        private PropertyOptionElement dispid;

        /// <summary>
        /// Директива dispid
        /// </summary>
        public PropertyOptionElement Dispid { get { return dispid; } set { dispid = value; } }

        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="Type">тип процедуры (процедура, конструктор, деструктор)</param>
        /// <param name="Name">имя процедуры</param>
        /// <param name="Vars">список параметров процедуры</param>
        /// <param name="Directives">список директив процедуры</param>
        /// <param name="ResultType">тип возвращаемого значения</param>
        /// <param name="Dispid">директива dispid</param>
        /// <param name="Comments">комментарии, относящиеся к элементу</param>
        public DispinterfaceFunctionHeadElement(TokenInfo Type, TokenInfo Name, List<FunctionVarDeclarationElement> Vars, List<DirectiveElement> Directives, ITypeElement ResultType, PropertyOptionElement Dispid, List<TokenInfo> Comments)
            : base(Type, Name, Vars, Directives, ResultType, Comments)
        {
            dispid = Dispid;
        }

        /// <summary>
        /// Представление элемента в строковом формате
        /// </summary>
        /// <returns>строковое представление элемента</returns>
        public override string ToString()
        {
            return string.Format("{0}{1}", base.ToString(), (dispid == null) ? string.Empty : string.Format(" {0};", dispid.ToString()));
        }

        /// <summary>
        /// Создание типизированного энумератора
        /// </summary>
        /// <returns>энумератор</returns>
        protected override IEnumerator<ISyntaxTreeElement> CreateEnumerator()
        {
            IEnumerator<ISyntaxTreeElement> baseEnumerator = base.CreateEnumerator();
            while (baseEnumerator.MoveNext())
                yield return baseEnumerator.Current;
            if (dispid != null)
                yield return dispid;
        }
    }
}
